package com.example.web;

import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletOutputStream;

public class GZIPServletOutputStream extends ServletOutputStream {

	GZIPOutputStream internalGzipOS;
	
	/**
	 * 넘어온 흐름을 java.util.zip.GZIPOutputStream 압축해서 다시 흐름으로 만들어서 내보내기 위한 클래스 
	 * 방법은 리턴 받고자 하는 타입의 변수를 선언하고 생성자에서 파라메터로 넘어온 흐름을 압축된걸로 바꿀때 넣어줘서 압축클래스 타입의 변수에다 넣어 준것
	 * 이렇게 넣어준 압축 타입의 참조를 ServletOutputStream 이것을 상속 받으면 다시 서블릿으로 보내 줄수 있음으로 상속 받아서 
	 * write 작성함 this.타입변수명 그리고 넘어온 파라메터 또는 상속받은 조상 타입 메서드 호출;
	 * 
	 * Decorator constructon 
	 * 이름 헷갈리지 말것 출력 버퍼를 사용하기 위해서 서블릿 아웃풋 스트리믕ㄹ 상속 받아서 클래스를 만들고 추상 메서드인 write 작성해줌 
	불러서 생성되면 넘겨 받은 파라메터를 압축 스트림 객체의 인스턴스를 자동으로 생성 (서블릿에서 나온 출력 문자를 압축 할수 있도록 인스턴스 만들어주고 이것을 출력한것 
	정리하면 서블릿에서 흐름이 넘어 온 것을 압축용 api인 java.util.zip.GZIPOutputStream 의 인스턴스 만들때 넘겨 줘서 압축 시키는 클래스 
	만든 방법을 정리하면 
	 * @throws IOException 
	 */
	public GZIPServletOutputStream(ServletOutputStream sos) throws IOException {
		this.internalGzipOS = new GZIPOutputStream(sos);
	}
	@Override
	public void write(int b) throws IOException {
		this.internalGzipOS.write(b);
		
	}

}
